package com.lixin.myannotation;

import java.lang.annotation.*;

/**
 * 自定义的元注解
 * 注解@Target表示这个注解可以标注在什么地方
 * ElementType.FIELD 表示可以标注在类的属性上
 * ElementType.METHOD 表示可以标在类的方法上
 * ElementType.TYPE 表示可以标注在类上
 *
 * 注解@Retention表示这个注解被保留多久
 * RetentionPolicy.SOURCE 注解只保留在源文件，当Java文件编译成class文件的时候，注解被遗弃；被编译器忽略
 * RetentionPolicy.CLASS 注解被保留到class文件，但jvm加载class文件时候被遗弃，这是默认的生命周期
 * RetentionPolicy.RUNTIME 注解不仅被保存到class文件中，jvm加载class文件之后，仍然存在
 *
 * 注解@Documented 表示这个注解在生成JavaDoc文档时依然保留
 *
 * 注解@Inherited 表示子类可以继承父类的注解
 *
 * 其中的每一个方法代表一个配置参数，方法的名称就是参数的名称，方法返回值类型就是参数的类型
 * 如果方法名为value，在标注注解的时候可以不指定参数名
 */
@Target(value = {ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface AnnotationOne {

    String type() default "";
    int id() default 1;
    int age() default 18;
    String[] s() default {"1", "2"};

}
